Методы сложения и вычитания формул. Методы условий и форматов
Операции с формулами
К полям, которые предназначены для ввода числа, можно применять арифметические действия. Например, такие поля как Сумма, Оплаченная сумма, Кол-во, Вес и подобные складываются, вычитаются и делятся друг с другом и с другими цифрами через базовые операторы + - * /
Важно, чтобы все слагаемые представляли собой единую формулу — чтобы все содержимое было в единых рамках ${ }
Порядок вычислений регулируется круглыми скобками.
Если в действии участвует дробная цифра, то дробная часть должна быть написана через точку, а не запятую.
Примеры формул:
${(row.sum.sum - row.payedSum) / 100} ${(o.sum.sumInCurrency / 100) * 0.5} ${position.quantity * position.good.weight} ${(formatter.findAttribute(o, “Доп. поле”).longValue + (o.sum.sum/100)) * 0.3}
Формат Даты
Сама по себе дата выводится формулой ${o.moment} или ${row.moment}
В этом случае ячейке, в которой формула, нужно применить тип — Дата. Это Формат ячейки в Excel.

Но такой метод не будет работать, если в той же ячейке с формулой есть любой статичный текст или другая формула. Например, когда в одной строке, нужно вывести неразрывно:
Товарный чек № 00656 от 15.05.2024 12:50
В таких случаях по отношению к формуле вывода даты применяется специальный метод formatter.format :
Товарный чек № ${o.name} от ${formatter.format(“%1$td.%1$tm.%1$tY %1$tH:%1$tM”, formatter.getExcelDate(o.moment))}
Формат записан в кавычках, это правило, по которому формула o.moment преобразуется в нужную форму.
В данном случает в кавычках записан формат ДД.ММ.ГГГГ чч:мм — это так называемые флаги.
Возможные флаги форматирования для дат
| Флаг | Описание |
| %tB | Полное название месяца, например, Январь, Февраль и т.д. |
| %tb | Сокращенное название месяца, например, Янв, Фев и т.д. |
| %tA | Полное название дня недели, например, Понедельник, Вторник |
| %ta | Сокращенное название дня недели, например, Пон, Вт и т.д. |
| %tY | Год в формате 4 цифры, например, от 0000 до 9999 |
| %ty | Год в формате 2 цифры, например, от 00 до 99 |
| %tm | Месяц отформатирован с нуля в начале, например, от 01 до 12 |
| %tD | Дата в формате %tm/%td/%ty |
| %td | День месяца в формате двух цифр, например, от 01 до 31 |
| %te | День месяца в формате без 0 в начале, например от 1 до 31 |
| %tT | Время в 24-часовом формате, например, %tH:%tM:%tS |
| %tH | Час дня в 24-часовом формате, от 00 до 23 |
| %tI | Час дня для 12-часового формата, например, от 01 до 12 |
| %tM | Минуты в часе форматируются с нуля в начале, например, от 00 до 59 |
| %tS | Секунды в минуте, состоящие из двух цифр, например, от 00 до 59 |
Примеры
| ${formatter.format(“%1$td.%1$tm.%1$tY”, formatter.getExcelDate(o.moment))} | 01.06.2024 |
| ${formatter.format(“%1$td.%1$tm.%1$ty”, formatter.getExcelDate(o.moment))} | 01.06.24 |
| ${formatter.format(”«%1$te» %1$tB %1$tY”, formatter.getExcelDate(o.moment))} года | «11» июня 2024 года |
| ${formatter.format(“%1$td %1$tb %1$tY”, formatter.getExcelDate(o.moment))} г. | 01 июн. 2024 г. |
Формат Числа
Если формула выводит число (сумма, количество), то такой метод применяется, чтобы результат был с нужным количеством знаков в дробной части или без дробной части совсем.
Например, нужно вывести сумма документа в составе текста:
*Оплачено по договору на сумму 50000,00 рублей *
Если в шаблоне запись имеет такой вид:
Оплачено по договору на сумму ${o.tail.payedSum/100} рублей,
то результат будет:
Оплачено по договору на сумму 50000.0 рублей
Результат такой, что число преобразовалось в текст.
Чтобы этого избежать, формулы, которые должны выводить Число, нужно “экранировать” форматом числа.
В этом случае формула будет иметь вид:
Оплачено по договору на сумму ${formatter.format(“%.2f”, o.tail.payedSum / 100)} рублей
Формат записан в кавычках. Это правило, по которому знаков после запятой будет сколько нам надо.
Варианты:
%.2f — 0,00
%.4f — 0,0000
%.0f — 0
Специальный метод, который выводит сумму с разрядностью: ${formatter.printLongAmount(o.sum.sum)} — 1 000 000,00
Формат Прописи
Применяется, когда нужно вывести число прописными буквами. Например, общее количество товаров прописью, кол-во штук прописью, доп. поле с типом целого числа прописью.
Для сумм в валюте используется метод — printAmount
Например, нужно вывести в составе текста:
Итого к оплате: Тридцать шесть тысяч четыре рубля 00 копеек
В этом случае формула будет иметь вид:
Итого к оплате: ${formatter.printAmount(formatter.getCurrency(o), o.sum.sumInCurrency)}
Дополнительно прописью доступно выводить сумму на Английском и Украинском языках:
${formatter.printAmountINR(formatter.getCurrency(o), o.sum.sumInCurrency)} — eng.
${formatter.printAmountUA(formatter.getCurrency(o), o.sum.sumInCurrency)} — укр.
Для вывода других чисел (кол-во, доп. поле, вес и т.д.) используется метод — printNumber
Примеры:
| Формула | Описание |
| ${formatter.printNumber(position.quantity)} | Количество позиции |
| ${formatter.printNumber(position.good.weight)} | Вес позиции |
| ${formatter.printNumber(formatter.calcTotalGoodsQuantity(o))} | Кол-во товаров во всем документе |
| ${formatter.printNumber(formatter.operationWeight(o))} | Общий вес по документу |
| ${formatter.printNumber(formatter.findAttribute(o, “Поставка (дней)“).longValue)} | Число из доп. поля (тип Число) |
printIf и printIfElse
Основной метод, когда нужно вывести то или иное значение при выполнении заданного условия.
Заключается в том, что задается условие и в зависимости от его результата сработает либо одна формула, либо другая.
Есть 2 варианта методов:
- ${formatter.printIf(условие, формула при выполнении)}
- ${formatter.prinIfElse(условие, формула при выполнении, формула при НЕ выполнении)}
Дословно объясняются так: - вывести формулу ТОЛЬКО ЕСЛИ выполняется условие
- вывести формулу ЕСЛИ выполняется условие ИНАЧЕ вывести другую формулу
Самый распространенный пример такой формулы:
${formatter.printIfElse(empty(o.targetAgentRequisite.legalTitle), o.targetAgentRequisite.agent.name, o.targetAgentRequisite.legalTitle)}
— объясняется, как проверка наличия в карточке контрагента/организации полного юридического наименования. При НЕ заполненном полном наименовании в карточке выведется краткое и соответственно, если заполнено (условие не выполнено), то как раз полное и будет выведено.
Существует также сокращенный вариант. Работает в точности, как formatter.prinIfElse, но имеет сокращенный вид записи:
${условие ? формула при выполнении : формула при НЕ выполнении}
${условие ? формула при выполнении : ” “}
Например:
${empty(o.targetAgentRequisite.legalTitle) ? o.targetAgentRequisite.agent.name : o.targetAgentRequisite.legalTitle}
${o.sourceAgent.getCompanyType() == “INPR” ? o.sourceAgentRequisite.ogrn : ” ”}
Другие примеры и операторы
| Оператор | Пример | Описание | |
| empty | не заполнено | ${formatter.printIfElse(empty(position.good.productCode), position.good.code, position.good.productCode)} | ЕСЛИ артикул товара не заполнен ТО выводи код ИНАЧЕ артикул |
| !empty | заполнено | ${formatter.printIf(!empty(o.contract), o.contract.name)} | ЕСЛИ указан договор ТО выводи его название |
| == | равно | ${formatter.printIf(row.payedSum == row.sum.sum, “Оплачено”, (row.sum.sum - row.payedSum) / 100)} | ЕСЛИ оплачена вся сумма документа ТО вывести “Оплачено” ИНАЧЕ вывести остаток к оплате |
| != | не равно | ${formatter.printIfElse(row.stock != 0, row.stock, “Нет в наличие”)} | ЕСЛИ остаток не 0 ТО вывести остаток ИНАЧЕ “какой-то текст” |
| > | больше | ${formatter.printIfElse(row.stock > 0, “В наличие”, “Нет в наличие”)} | ЕСЛИ остаток больше 0 ТО вывести “текст” ИНАЧЕ “другой текст” |
| < | меньше | ||
| && | и | ${formatter.printIf(row.payedSum == 0 && row.shippedSum== 0, row.name)} | логическое И. Чтобы сравнивать в условии два и более свойств. Например, ЕСЛИ оплачено 0 (row.payedSum == 0) И отгружено 0 (row.shippedSum== 0) |
| || | или | ${formatter.printIf(row.payedSum == 0 || row.shippedSum== 0, row.name)} | логическое ИЛИ. В отличии от И условие считается выполненным, если хотя бы одно из нескольких свойств отвечает заданному параметру |
| + | сложение | ${formatter.printIf(!empty(o.contract), “Договор ” + o.contract.name + ” от ” + formatter.format(“%1$td.%1$tm.%1$tY”, formatter.getExcelDate(o.contract.moment)))} | Применятся, когда нужно прибавить “статичный текст” к формуле |
Статичный текст в формулах пишется в двойных (“text”) или одинарных (‘text’) кавычках.